This is a simple jugging game I created for this week’s assignment. I wanted to replace the 2 circles with images of circus balls but I having problems. I also couldn’t get them to rotate.
I started with the Example code in Processing for BouncyBubbles and I built the game on top of that.
/* This stetch will produce a little juggling game */ //int numBalls = 2; int numBalls = 3; float spring = 0.05; float gravity = 0.03; float friction = -0.9; Ball[] balls = new Ball[numBalls]; int gameLength = 30; //how long the game will last in seconds int timer; //time in seconds int counter = 0; int timedScore; int savedTimeScore; int ballsUpStartTime; //int ballCounter = 0; //number of balls in the air void setup() { size(400, 700); noStroke(); smooth(); for (int i = 0; i < numBalls; i++) { balls[i] = new Ball(random(width), height, random(20, 40), i, balls); } } void draw() { background(0); for (int i = 0; i < numBalls; i++) { balls[i].collide(); balls[i].move(); balls[i].display(); } //set the countdown timer timer = gameLength - int(millis()/1000); text ("Time left: " + timer, 20, 10); //set the ball counter = number of balls in the air int ballCounter=0; for (int i=0; i<numBalls; i++) { if (balls[i].onTheFloor() == false) { ballCounter++; } } if (ballCounter == balls.length) { //reset the time counter println("All BALLS UP!"); //start timing //timedScore += int(frameCount /60); ballsUpStartTime = int(millis()/1000); println("millis/1000 "+int(millis()/1000)); timedScore = int(millis() /1000) - ballsUpStartTime; println("timedScore : "+timedScore); }else { // if there's a ball on the ground, save the time //check if the time is bigger that the other time if (timedScore > savedTimeScore){ savedTimeScore = timedScore; } timedScore = 0; } text ("Balls in the Air: " + ballCounter, 10, 50); if (timer == 0) { noLoop(); background(0); fill(150); text("Your top score: "+ savedTimeScore, width/2, height/2); } }// end draw void mousePressed() { for (int i = 0; i < numBalls; i++) { balls[i].collideWMouse(mouseX, mouseY); } } class Ball { float x, y; float diameter = 50; float vx = 0; float vy = 0; int id; int ballRotation = 0; int push = 2;//for the on-click function Ball[] others; PImage b; boolean onTheFloor = true; Ball(float xin, float yin, float din, int idin, Ball[] oin) { x = xin; y = yin; id = idin; others = oin; b = loadImage("circusball.gif"); } void collide() { for (int i = id + 1; i < numBalls; i++) { float dx = others[i].x - x; float dy = others[i].y - y; float distance = sqrt(dx*dx + dy*dy); float minDist = others[i].diameter/2 + diameter/2; if (distance < minDist) { float angle = atan2(dy, dx); float targetX = x + cos(angle) * minDist; float targetY = y + sin(angle) * minDist; float ax = (targetX - others[i].x) * spring; float ay = (targetY - others[i].y) * spring; vx -= ax; vy -= ay; others[i].vx += ax; others[i].vy += ay; } } } void collideWMouse(int mousePosX, int mousePosY) { if (mousePosX >x - diameter/2 && mousePosX < x + diameter/2 && mousePosY > y-diameter/2 && mousePosY < y + diameter/2) { // println("You hit Ball #" + id); // println("on the Floor: " +onTheFloor()); // println("Y: " +y); vy = -(Math.abs((vy+1) + push)); } } void move() { vy += gravity; x += vx; y += vy; // this.rotate(ballRotation++); if (x + diameter/2 > width) { x = width - diameter/2; vx *= friction; } else if (x - diameter/2 < 0) { x = diameter/2; vx *= friction; } if (y + diameter/2 > height) { y = height - diameter/2; vy *= 0; fill(255, 0, 0); } else if (y - diameter/2 < 0) { y = diameter/2; vy *= friction; } } void display() { fill(255, 204); ellipse(x, y, diameter, diameter); // image(b, x, y, diameter, diameter); } boolean onTheFloor() { if (y + diameter/2 >= height) { onTheFloor = true; } else { onTheFloor = false; } return onTheFloor; } }//end Ball class